package com.boful.convert.core;

import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

import com.boful.convert.model.DiskFile;

public abstract class ConvertProvider {

	private String name;
	private String description;
	private String ip;
	private int port;
	private Map<String, String> params = new HashMap<String, String>();
	private static final Logger LOGGER = Logger
			.getLogger(ConvertProvider.class);

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public Map<String, String> getParams() {
		return params;
	}

	public void setParams(Map<String, String> params) {
		this.params = params;
	}

	public ConvertProvider(String name, String description, String ip,
			int port, Map<String, String> params) throws Exception {
		super();
		this.name = name;
		this.description = description;
		this.ip = ip;
		this.port = port;
		this.params = params;
		if (name == null || ip == null || port <= 0) {
			throw new Exception("参数不完整");
		}
	}

	public ConvertProvider(ConvertProviderConfig config) {
		this.name = config.getName();
		this.description = config.getDescription();
		HostConfig hostConfig = config.getHosts().get(0);
		this.ip = hostConfig.getIp();
		this.port = hostConfig.getPort();
		this.params = hostConfig.getParams();
	}

	/**
	 * 获取文件长度（音视频文件返回时长,单位秒;文档返回总页数;课件返回总大小）
	 * 
	 * @param diskFile
	 *            物理文件
	 * @return 逻辑文件长度
	 */
	public abstract long getLogicLength(DiskFile diskFile);

	/**
	 * 转视频文件
	 * 
	 * @param diskFile
	 *            源文件
	 * @param destFile
	 *            目标文件
	 * @param width
	 *            分辨率宽(-1未设置)
	 * @param height
	 *            分辨率高(-1未设置)
	 * @param videoBitrate
	 *            视频码率(单位:kbps,-1未设置),1080*720的分辨率，用5000K左右就可以
	 *            720*576的分辨率，用3500K左右就可以 640*480的分辨率，用1500K左右就可以
	 * @param audioBitrate
	 *            音频码率(单位:kbps,-1未设置),音频码率应该在256以上，相对比较好一点。 128K就低了
	 * @param transcodeEvent
	 *            事件
	 * @param jobId 任务Id，建议用uuid
	 */
	public abstract void transcodeVideo(DiskFile diskFile, DiskFile destFile,
			int width, int height, int videoBitrate, int audioBitrate,
			TranscodeEvent transcodeEvent,String jobId);

	/**
	 * 转视频文件
	 * 
	 * @param diskFile
	 *            源文件
	 * @param destFile
	 *            目标文件
	 * @param transcodeEvent
	 *            事件
	 * @param jobId 任务Id，建议用uuid
	 */
	public void transcodeVideo(DiskFile diskFile, DiskFile destFile,
			TranscodeEvent transcodeEvent,String jobId) {
		transcodeVideo(diskFile, destFile, -1, -1, -1, -1, transcodeEvent,jobId);
	}

	/***
	 * 转音频文件
	 * 
	 * @param diskFile
	 *            源文件
	 * @param destFile
	 *            目标文件
	 * @param audioBitrate
	 *            音频码率-1为自适应
	 * @param transcodeEvent
	 *            事件允许为空
	 * @param jobId 任务Id，建议用uuid
	 */
	public abstract void transcodeAudio(DiskFile diskFile, DiskFile destFile,
			int audioBitrate, TranscodeEvent transcodeEvent,String jobId);

	/**
	 * 转码文档到pdf
	 * 
	 * @param diskFile
	 * @param destFile
	 * @param transcodeEvent
	 * @param jobId 任务Id，建议用uuid
	 */
	public abstract void transcode2PDF(DiskFile diskFile, DiskFile destFile,
			TranscodeEvent transcodeEvent,String jobId);

	/**
	 * 转码pdf到swf文件
	 * 
	 * @param srcFile
	 * @param destFile
	 * @param transcodeEvent
	 * @param jobId 任务Id，建议用uuid
	 */
	public abstract void transcode2SWF(DiskFile srcFile, DiskFile destFile,
			TranscodeEvent transcodeEvent,String jobId);

	/**
	 * 支持的格式
	 * 
	 * @return 支持的文件后缀名
	 */
	public abstract String[] supportFormat();

	/**
	 * 判定转换是否支持
	 * 
	 * @param srcFormat
	 *            原格式后缀名
	 * @param destFormat
	 *            目标格式后缀名
	 * @return true 支持 false 不支持
	 */
	public abstract boolean isSupportTranscode(String srcFormat,
			String destFormat);

	/**
	 * 截图，支持文档、视频
	 * 
	 * @param src
	 *            源文件
	 * @param width
	 *            要求的宽,未设置时-1
	 * @param height
	 *            要求的高,未设置时-1
	 * @param position
	 *            位置，视频第position秒，文档第position页。如果是-1，视频1/3,文档第1页
	 * @param dest
	 *            目标文件
	 * @throws Exception
	 *             截图失败
	 */
	public abstract void screenshot(DiskFile src, int width, int height,
			int position, DiskFile dest) throws Exception;
}
